//
//  ZYVisitorImp.h
//  DesignMode
//
//  Created by wangzhipan on 2024/12/9.
//

/*
 访问者模式：
    在软件设计中，常常需要新增\改变某些行为：
        如果使用类继承去做的话，需要在基类中进行更改，会给子类带来繁重的变更负担
 
    访问者模式提供了一种在不改变类层次结构的前提下，在运行时根据需求透明的为类层次结构上的各个类动态添加新的操作
 
    实际操作：
 
        在IVisitor和IElement接口不变的前提下，如果IVisitor中的行为实现需要改变的话，就可以用Visitor3实现IVisitor协议，再组合到ElementA和ElementB中
 
        如果IVisitor新增行为，那么需要在子类中实现对应行为，然后再用Element来使用
 */

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN


@protocol IElement;

/*
 IVisitor中封装着行为：
    比如A对象有IVisitor的一些行为A
    B对象有IVisitor的一些行为B
    C对象有IVisitor的一些行为C
 
    【A、B、C可以有交集、无交集，也可以方法相同，但实现不同】
 */
@protocol IVisitor <NSObject>
- (void)operatorOneForElementA:(id<IElement>)element;
- (void)operatorTwoForElementA:(id<IElement>)element;

- (void)operatorOneForElementB:(id<IElement>)element;
- (void)operatorTwoForElementB:(id<IElement>)element;

@end

@protocol IElement <NSObject>
- (void)acceptVisitor:(id<IVisitor>)visitor;
@end

//扩展不同的行为Visitor1、Visitor2
@interface ZYVisitor1 : NSObject<IVisitor>
@end

@interface ZYVisitor2 : NSObject<IVisitor>
@end


//不同的对象，所需要配置的行为实现不同，但接口一致
@interface ZYElementA : NSObject<IElement>
@end

@interface ZYElementB : NSObject<IElement>
@end


@interface ZYVisitorMainPage : NSObject

@end



NS_ASSUME_NONNULL_END
